package fwmpc.service;

import fwmpc.function.WeiXinTokenManagerFunction;
import fwmpc.resource.IWeiXinAttributeItem;
import net.sf.json.JSONObject;

import java.util.Map;

/**
 * 接口描述:  微信核心应用处理Service接口
 *
 * @author 王雷
 * @version 1.0.0
 * @date 2021/1/21 0021 上午 10:46
 */
public interface IWeiXinCoreApplicationManagerService {
    /**
     * 功能描述：微信换取Access_token处理
     *
     * @param appId 标识
     * @param code  微信方获取的编码
     * @throws Exception 处理异常
     * @author : 王雷
     * @date : 2021/1/21 0021 上午 11:37
     */
    JSONObject giveTokenToOpenId(String appId, String code) throws Exception;

    /**
     * 功能描述：获取Token
     *
     * @param appId 标识
     * @return 返回的数据结果；
     * @date : 2022/7/23 0023 上午 11:10
     */
    String giveToken(String appId) throws Exception;

    /**
     * 功能描述：获取OpenId
     *
     * @param appId 应用标识
     * @param code  标识
     * @return 返回的数据结果；
     * @date : 2022/7/23 0023 上午 11:10
     */
    String giveOpenId(String appId, String code) throws Exception;

    /**
     * 功能描述：获取Ticket
     *
     * @param appId 标识
     * @return 返回的数据结果；
     * @date : 2022/7/23 0023 上午 11:10
     */
    String giveTicket(String appId) throws Exception;

    /**
     * 功能描述：获取Token
     *
     * @return 返回的数据结果；
     * @date : 2022/7/23 0023 上午 11:10
     */
    String giveDefaultToken() throws Exception;

    /**
     * 功能描述：获取Ticket
     *
     * @return 返回的数据结果；
     * @date : 2022/7/23 0023 上午 11:10
     */
    String giveDefaultTicket() throws Exception;

    /**
     * 功能描述：获取Token与Ticket
     *
     * @param appId 标识
     * @return 返回的数据结果；
     * @date : 2022/7/23 0023 上午 11:10
     */
    Map<String, String> giveTokenAndTicket(String appId) throws Exception;

    /**
     * 功能描述：获取Token与Ticket
     *
     * @return 返回的数据结果；
     * @date : 2022/7/23 0023 上午 11:10
     */
    Map<String, String> giveTokenAndTicket() throws Exception;

    /**
     * 功能描述：根据AppId获取Mch信息
     *
     * @param appId           标识
     * @param comparisonValue 比较值
     * @throws Exception 处理异常
     * @author : 王雷
     * @date : 2021/1/21 0021 上午 11:37
     */
    <D> IWeiXinAttributeItem.MchDataBean giveMchDataByAppIdToMap(String appId, D comparisonValue) throws Exception;

    /**
     * 功能描述：根据AppId获取Mch信息
     *
     * @param appId           标识
     * @param comparisonValue 比较值
     * @throws Exception 处理异常
     * @author : 王雷
     * @date : 2021/1/21 0021 上午 11:37
     */
    <D> IWeiXinAttributeItem.MchDataBean giveWithdrawMchData(String appId, D comparisonValue) throws Exception;

    /**
     * 功能描述：根据AppId获取Mch信息
     * <br />
     *
     * @param mchId 支付商户号
     * @throws Exception 处理异常
     * @author : 王雷
     * @date : 2021/1/21 0021 上午 11:37
     */
    IWeiXinAttributeItem.MchDataBean giveWeiXinPayMchDataBean(String mchId) throws Exception;

    /**
     * 功能描述：根据AppId获取Mch信息
     * <br />
     * 退款专用
     *
     * @param appId 标识
     * @param mchId 支付商户号
     * @throws Exception 处理异常
     * @author : 王雷
     * @date : 2021/1/21 0021 上午 11:37
     */
    IWeiXinAttributeItem.MchDataBean giveMchDataByAppIdByRefundToMap(String appId, String mchId) throws Exception;

    /**
     * 功能描述：根据默认配置获取Mch信息
     *
     * @param comparisonValue 比较值
     * @throws Exception 处理异常
     * @author : 王雷
     * @date : 2021/1/21 0021 上午 11:37
     */
    <D> IWeiXinAttributeItem.MchDataBean giveMchDataToDefault(D comparisonValue) throws Exception;

    /**
     * 功能描述：根据AppId获取Mch信息
     *
     * @param appId 标识
     * @throws Exception 处理异常
     * @author : 王雷
     * @date : 2021/1/21 0021 上午 11:37
     */
    Map<String, IWeiXinAttributeItem.MchDataBean> giveMchDataByAppIdToMap(String appId) throws Exception;

    /**
     * 功能描述：微信参数——平台标识
     *
     * @author : 王雷
     * @date : 2021/1/16 0016 下午 9:05
     */
    Long giveAppPlatformId(String appId);

    /**
     * 功能描述：获得微信签名方法
     *
     * @date : 2022/6/29 0029 下午 8:15
     */
    String dataSignManager(Map<String, Object> params, String appkey);

    /**
     * 功能描述：获得微信签名方法
     *
     * @param params          签名内容
     * @param appId           标识
     * @param comparisonValue 比较值
     * @date : 2022/6/29 0029 下午 8:15
     */
    <D> String dataSignManager(Map<String, Object> params, String appId, D comparisonValue) throws Exception;

    /**
     * 功能描述：获得微信签名方法
     *
     * @param managerData                需要处理的数据
     * @param encryptionKey              加密Key
     * @param weiXinTokenManagerFunction 处理回调函数
     * @param size                       随机数长度
     * @param expiration                 失效时间；单位：秒
     * @param secret                     secret标识
     * @date : 2022/6/29 0029 下午 8:15
     */
    <T, D> T giveDataToken(D managerData, int size, String encryptionKey, WeiXinTokenManagerFunction<T> weiXinTokenManagerFunction
            , Long expiration, String secret) throws Exception;

//    /**
//     * 功能描述：获得微信签名方法
//     *
//     * @param managerData   需要处理的数据
//     * @param randomKey     随机字符串
//     * @param encryptionKey 加密Key
//     * @param expiration    失效时间；单位：秒
//     * @param secret        secret标识
//     * @date : 2022/6/29 0029 下午 8:15
//     */
//    <D> String generateToken(D managerData, String randomKey, String encryptionKey, Long expiration, String secret) throws Exception;

    /**
     * 功能描述：微信用户信息解密处理
     *
     * @param encryptedData 加密数据
     * @param sessionKey    会话密钥
     * @param ivData        微信IV数据
     * @return 解密后的结果
     * @date : 2022/7/6 0006 下午 2:52
     */
    JSONObject wxUserInformationDecryptionProcessing(String encryptedData, String sessionKey, String ivData) throws Exception;
}
